home *** CD-ROM | disk | FTP | other *** search
- """rule bindings for sql grammar."""
-
- def elt0(list, context):
- """return first member of reduction"""
- return list[0]
-
- def elt1(list, context):
- """return second member"""
- return list[1]
-
- def elt2(list, context):
- return list[2]
-
- def returnNone(list, context):
- return None
-
- def stat1(list, context):
- """return list of len 1 of statements"""
- return list
-
- #def statn(list, context):
- # """return a list of statement reductions"""
- # [stat, semi, statlist] = list
- # statlist.insert(0, stat)
- # return statlist
-
- def thingcommalist(l, c):
- [thing, comma, list] = l
- list.insert(0, thing)
- return list
-
- def listcommathing(l, c):
- [list, comma, thing] = l
- list.append(thing)
- return list
-
- statn = thingcommalist
- selstat = elt0
- insstat = elt0
- createtablestat = elt0
- droptablestat = elt0
- delstat = elt0
- updatestat = elt0
- createindexstat = elt0
- dropindexstat = elt0
- createviewstat = elt0
- dropviewstat = elt0
-
- # drop view statement stuff
- def dropview(l, c):
- [drop, view, name] = l
- from sqlsem import DropView
- return DropView(name)
-
- # create view statement stuff
- def createview(l, c):
- [create, view, name, namelist, as, selection] = l
- from sqlsem import CreateView
- return CreateView(name, namelist, selection)
-
- optnamelist0 = returnNone
- optnamelistn = elt1
-
- # drop index statement stuff
- def dropindex(l, c):
- [drop, index, name] = l
- from sqlsem import DropIndex
- return DropIndex(name)
-
- # create index statement stuff
- def createindex(l, c):
- [create, index, name, on, table, op, namelist, cp] = l
- from sqlsem import CreateIndex
- return CreateIndex(name, table, namelist)
-
- def createuniqueindex(l, c):
- [create, unique, index, name, on, table, op, namelist, cp] = l
- from sqlsem import CreateIndex
- return CreateIndex(name, table, namelist, unique=1)
-
- names1 = stat1
- namesn = listcommathing
-
- # update statement stuff
-
- def update(l, c):
- [upd, name, set, assns, condition] = l
- from sqlsem import UpdateOp
- return UpdateOp(name, assns, condition)
-
- def assn(l, c):
- [col, eq, exp] = l
- return (col, exp)
-
- def assn1(l, c):
- [ (col, exp) ] = l
- from sqlsem import TupleCollector
- result = TupleCollector()
- result.addbinding(col, exp)
- return result
-
- def assnn(l, c):
- [ result, comma, (col, exp) ] = l
- result.addbinding(col, exp)
- return result
-
- # delete statement stuff
-
- def deletefrom(l, c):
- [delete, fromkw, name, where] = l
- from sqlsem import DeleteOp
- return DeleteOp(name, where)
-
- # drop table stuff
-
- def droptable(l, c):
- [drop, table, name] = l
- from sqlsem import DropTable
- return DropTable(name)
-
- # create table statement stuff
-
- def createtable(list, context):
- [create, table, name, p1, colelts, p2] = list
- from sqlsem import CreateTable
- return CreateTable(name, colelts)
-
- colelts1 = stat1
- coleltsn = listcommathing
- #def coleltsn(list, c):
- # [c1, cc, ce] = list
- # c1.append(ce)
- # return c1
-
- coleltid = elt0
- coleltconstraint = elt0
-
- def coldef(l, c):
- [colid, datatype, default, constraints] = l
- from sqlsem import ColumnDef
- return ColumnDef(colid, datatype, default, constraints)
-
- optdef0 = returnNone
- optcolconstr0 = returnNone
- stringtype = exnumtype = appnumtype = integer = float = varchar = elt0
- varcharn = elt0
-
- # insert statement stuff
-
- def insert1(l, c):
- [insert, into, name, optcolids, insert_spec] = l
- from sqlsem import InsertOp
- return InsertOp(name, optcolids, insert_spec)
-
- optcolids0 = returnNone
- optcolids1 = elt1
- colids1 = stat1
- colidsn = listcommathing
-
- def insert_values(l, c):
- from sqlsem import InsertValues
- return InsertValues(l[2])
-
- def insert_query(l, c):
- from sqlsem import InsertSubSelect
- return InsertSubSelect(l[0])
-
- litlist1 = stat1
- litlistn = listcommathing
-
- sliteral0 = elt0
- def sliteralp(l, c):
- [p, v] = l
- return +v
-
- def sliterald(l, c):
- [l1, m, l2] = l
- return l1 - l2
-
- def sliterals(l, c):
- [l1, p, l2] = l
- return l1 + l2
-
- def sliteralm(l, c):
- [m, v] = l
- return -v
-
- # select statement stuff
-
- def selectx(list, context):
- [sub, optorder_by] = list
- #sub.union_select = optunion
- sub.order_by = optorder_by
- # number of dynamic parameters in this parse.
- sub.ndynamic = context.ndynamic()
- return sub
-
- psubselect = elt1
-
- def subselect(list, context):
- [select, alldistinct, selectlist, fromkw, trlist,
- optwhere, optgroup, opthaving, optunion] = list
- from sqlsem import Selector
- sel = Selector(
- alldistinct,
- selectlist,
- trlist,
- optwhere,
- optgroup,
- opthaving,
- # store # of dynamic parameters seen in this parse.
- ndynamic = context.ndynamic()
- )
- sel.union_select = optunion
- return sel
-
- def ad0(list, context):
- return "ALL"
-
- adall = ad0
-
- def addistinct(list, context):
- return "DISTINCT"
-
- def where0(list, context):
- from sqlsem import BTPredicate
- return BTPredicate() # true
-
- where1 = elt1
-
- group0 = returnNone
-
- group1 = elt2
-
- colnames1 = stat1
-
- colnamesn = listcommathing
-
- having0 = returnNone
-
- having1 = elt1
-
- union0 = returnNone
-
- def union1(l, c):
- [union, alldistinct, selection] = l
- from sqlsem import Union
- return Union(alldistinct, selection)
-
- def except1(l, c):
- [union, selection] = l
- alldistinct = "DISTINCT"
- from sqlsem import Except
- return Except(alldistinct, selection)
-
- def intersect1(l, c):
- [union, selection] = l
- alldistinct = "DISTINCT"
- from sqlsem import Intersect
- return Intersect(alldistinct, selection)
-
- order0 = returnNone
- order1 = elt2
- #orderby = elt2
- sortspec1 = stat1
- sortspecn = listcommathing
-
- def sortint(l, c):
- from sqlsem import PositionedSort
- [num, ord] = l
- from types import IntType
- if type(num)!=IntType or num<=0:
- raise ValueError, `num`+': col position not positive int'
- return PositionedSort(num, ord)
-
- def sortcol(l, c):
- from sqlsem import NamedSort
- [name, ord] = l
- return NamedSort(name, ord)
-
- def optord0(l, c):
- return "ASC"
-
- optordasc = optord0
-
- def optorddesc(l, c):
- return "DESC"
-
- ## table reference list returns list of (name, name) or (name, alias)
- def trl1(l, c):
- [name] = l
- return [(name, name)]
-
- def trln(l,c):
- [name, comma, others] = l
- others.insert(0, (name, name))
- return others
-
- def trl1a(l,c):
- [name, alias] = l
- return [(name, alias)]
-
- def trlna(l,c):
- [name, alias, comma, others] = l
- others.insert(0, (name, alias))
- return others
-
- def trl1as(l,c):
- [name, as, alias] = l
- return [(name, alias)]
-
- def trlnas(l,c):
- [name, as, alias, comma, others] = l
- others.insert(0, (name, alias))
- return others
-
- tablename1 = elt0
- columnid1 = elt0
-
- def columnname1(list, context):
- [ci] = list
- return columnname2([None, None, ci], context)
-
- def columnname2(list, context):
- [table, ignore, col] = list
- from sqlsem import BoundAttribute
- return BoundAttribute(table, col)
-
- def dynamic(list, context):
- from sqlsem import BoundAttribute
- # return a new dynamic parameter
- int = context.param()
- return BoundAttribute(0, int)
-
- # expression stuff
- def literal(list, context):
- [lit] = list
- from sqlsem import Constant
- return Constant(lit)
-
- def stringstring(l, c):
- """two strings in sequence = apostrophe"""
- [l1, l2] = l
- from sqlsem import Constant
- value = "%s'%s" % (l1.value0, l2)
- return Constant(value)
-
- numlit = literal
- stringlit = literal
- primarylit = elt0
- primary1 = elt0
- factor1 = elt0
- term1 = elt0
- exp1 = elt0
-
- def expplus(list, context):
- [exp, plus, term] = list
- return exp + term
-
- def expminus(list, context):
- [exp, minus, term] = list
- return exp - term
-
- def termtimes(list, context):
- [exp, times, term] = list
- return exp * term
-
- def termdiv(list, context):
- [exp, div, term] = list
- return exp / term
-
- plusfactor = elt1
-
- def minusfactor(list, context):
- [minus, factor] = list
- return -factor
-
- primaryexp = elt1
-
- primaryset = elt0
-
- def countstar(l, c):
- from sqlsem import Count
- return Count("*")
-
- def distinctset(l, c):
- [agg, p1, distinct, exp, p2] = l
- return set(agg, exp, 1)
-
- distinctcount = distinctset
-
- def allset(l, c):
- [agg, p1, exp, p2] = l
- return set(agg, exp, 0)
-
- allcount = allset
-
- def set(agg, exp, distinct):
- import sqlsem
- if agg=="AVG":
- return sqlsem.Average(exp, distinct)
- if agg=="COUNT":
- return sqlsem.Count(exp, distinct)
- if agg=="MAX":
- return sqlsem.Maximum(exp, distinct)
- if agg=="MIN":
- return sqlsem.Minimum(exp, distinct)
- if agg=="SUM":
- return sqlsem.Sum(exp, distinct)
- if agg=="MEDIAN":
- return sqlsem.Median(exp, distinct)
- raise NameError, `agg`+": unknown aggregate"
-
- average = count = maximum = minimum = summation = median = elt0
-
- def predicateeq(list, context):
- [e1, eq, e2] = list
- return e1.equate(e2)
-
- def predicatene(list, context):
- [e1, lt, gt, e2] = list
- return ~(e1.equate(e2))
-
- def predicatelt(list, context):
- [e1, lt, e2] = list
- return e1.lt(e2)
-
- def predicategt(list, context):
- [e1, lt, e2] = list
- return e2.lt(e1)
-
- def predicatele(list, context):
- [e1, lt, eq, e2] = list
- return e1.le(e2)
-
- def predicatege(list, context):
- [e1, lt, eq, e2] = list
- return e2.le(e1)
-
- def predbetween(list, context):
- [e1, between, e2, andkw, e3] = list
- from sqlsem import BetweenPredicate
- return BetweenPredicate(e1, e2, e3)
-
- def prednotbetween(list, context):
- [e1, notkw, between, e2, andkw, e3] = list
- from sqlsem import BetweenPredicate
- return ~BetweenPredicate(e1, e2, e3)
-
- predicate1 = elt0
- bps = elt1
- bp1 = elt0
-
- # exists predicate stuff
- predexists = elt0
- def exists(l, c):
- [ex, paren1, subquery, paren2] = l
- from sqlsem import ExistsPred
- return ExistsPred(subquery)
-
- def notbf(list, context):
- [ notst, thing ] = list
- return ~thing
-
- # quantified predicates
- nnall = elt0
- nnany = elt0
-
- def predqeq(list, context):
- [exp, eq, allany, p1, subq, p2] = list
- from sqlsem import QuantEQ, QuantNE
- if allany=="ANY":
- return QuantEQ(exp, subq)
- else:
- return ~QuantNE(exp, subq)
-
- def predqne(list, context):
- [exp, lt, gt, allany, p1, subq, p2] = list
- from sqlsem import QuantEQ, QuantNE
- if allany=="ANY":
- return QuantNE(exp, subq)
- else:
- return ~QuantEQ(exp, subq)
-
- def predqlt(list, context):
- [exp, lt, allany, p1, subq, p2] = list
- from sqlsem import QuantLT, QuantGE
- if allany=="ANY":
- return QuantLT(exp, subq)
- else:
- return ~QuantGE(exp, subq)
-
- def predqgt(list, context):
- [exp, gt, allany, p1, subq, p2] = list
- from sqlsem import QuantGT, QuantLE
- if allany=="ANY":
- return QuantGT(exp, subq)
- else:
- return ~QuantLE(exp, subq)
-
- def predqle(list, context):
- [exp, less, eq, allany, p1, subq, p2] = list
- from sqlsem import QuantGT, QuantLE
- if allany=="ANY":
- return QuantLE(exp, subq)
- else:
- return ~QuantGT(exp, subq)
-
- def predqge(list, context):
- [exp, gt, eq, allany, p1, subq, p2] = list
- from sqlsem import QuantGE, QuantLT
- if allany=="ANY":
- return QuantGE(exp, subq)
- else:
- return ~QuantLT(exp, subq)
-
- # subquery expression
- def subqexpr(list, context):
- [p1, subq, p2] = list
- from sqlsem import SubQueryExpression
- return SubQueryExpression(subq)
-
- def predin(list, context):
- [exp, inkw, p1, subq, p2] = list
- from sqlsem import InPredicate
- return InPredicate(exp, subq)
-
- def prednotin(list, context):
- [exp, notkw, inkw, p1, subq, p2] = list
- from sqlsem import InPredicate
- return ~InPredicate(exp, subq)
-
- def predinlits(list, context):
- [exp, inkw, p1, lits, p2] = list
- from sqlsem import InLits
- return InLits(exp, lits)
-
- def prednotinlits(list, context):
- [exp, notkw, inkw, p1, lits, p2] = list
- from sqlsem import InLits
- return ~InLits(exp, lits)
-
-
- bf1 = elt0
-
- def booln(list, context):
- [ e1, andst, e2 ] = list
- return e1&e2
-
- bool1 = elt0
-
- def searchn(list, context):
- [ e1, orst, e2 ] = list
- return e1 | e2
-
- search1 = elt0
-
- colalias = elt0
-
- # select list stuff
- def selectstar(l,c):
- return "*"
-
- selectsome = elt0
- select1 = elt0
-
- # selectsub returns (expression, asname)
-
- def select1(list, context):
- [ (exp, name) ] = list
- from sqlsem import TupleCollector
- result = TupleCollector()
- result.addbinding(name, exp)
- return result
-
- def selectn(list, context):
- [ selectsubs, comma, select_sublist ] = list
- (exp, name) = select_sublist
- selectsubs.addbinding(name, exp)
- return selectsubs
-
- def selectit(list, context):
- [exp] = list
- return (exp, None) # no binding!
-
- def selectname(list, context):
- [exp, as, alias] = list
- return (exp, alias)
-
- colalias = elt0
-
-
- #### do the bindings.
-
- # note: all reduction function defs must precede this assign
- VARS = vars()
-
- class punter:
- def __init__(self, name):
- self.name = name
- def __call__(self, list, context):
- print "punt:", self.name, list
- return list
-
- class tracer:
- def __init__(self, name, fn):
- self.name = name
- self.fn = fn
-
- def __call__(self, list, context):
- print self.name, list
- return self.fn(list, context)
-
- def BindRules(sqlg):
- for name in sqlg.RuleNameToIndex.keys():
- if VARS.has_key(name):
- #print "binding", name
- sqlg.Bind(name, VARS[name]) # nondebug
- #sqlg.Bind(name, tracer(name, VARS[name]) ) # debug
- else:
- print "unbound", name
- sqlg.Bind(name, punter(name))
- return sqlg
-
-
-